#include <iostream>
#include <memory>
#include "creational/abstractfactory.h"
#include "creational/factorymethod.h"
#include "creational/singleton.h"
#include "creational/prototype.h"
#include "creational/builder.h"
#include "structural/adapter.h"
#include "structural/bridge.h"
#include "structural/composite.h"
#include "structural/decorator.h"
#include "structural/facade.h"
#include "structural/flyweight.h"
#include "structural/proxy.h"
#include "behavioral/observer.h"
#include "behavioral/templatemethod.h"
#include "behavioral/strategy.h"
#include "behavioral/chainofresponsibility.h"
#include "behavioral/command.h"

using namespace std;
using namespace abstractfactory;
// using namespace factorymethod;
// using namespace singleton;
// using namespace prototype;
// using namespace builder;
// using namespace adapter;
// using namespace bridge;
// using namespace composite;
// using namespace decorator;
// using namespace facade;
// using namespace flyweight;
// using namespace proxy;
// using namespace observer;
// using namespace templatemethod;
// using namespace strategy;
// using namespace chainofresponsibility;
// using namespace command;

int main(int argc, char const *argv[])
{
    //AbstractFactory begin
    unique_ptr<WhiteFactory> whiteFactory(new WhiteFactory);
    ClientCode(whiteFactory.get());
    unique_ptr<BlackFactory> blackFactory(new BlackFactory);
    ClientCode(blackFactory.get());
    //AbstractFactory end

    // //FactoryMethod begin
    // unique_ptr<AbstractFactory> whiteSheos(new WhiteSheosFactory);
    // ClientCode(whiteSheos.get());
    // unique_ptr<AbstractFactory> blackSheos(new BlackSheosFactory);
    // ClientCode(blackSheos.get());
    // //FactoryMethod end

    //Singleton/Prototype/Builder/Adapter/Bridge/Composite begin
    // ClientCode();
    //Singleton/Prototype/Builder/Adapter/Bridge/Composite end

    return 0;
}
